package com.rem.lambda.part2;

import org.junit.Test;

import java.util.Comparator;
import java.util.Date;
import java.util.function.Consumer;

/**
 * 一：Lambda 表达式的基础语法：Java8中新的操作符 ->  箭头操作符/Lambda操作符
 * <p>
 * ->左侧： Lambda 表达式的参数列表
 * ->右侧： Lambda 表达式中所需执行的功能，即Lambda 体
 * <p>
 * 语法格式一：抽象方法无参数 无返回值
 * () -> System.out.printIn("hello Lambda")
 * <p>
 * 语法格式二：抽象方法有一个参数，无返回值
 * (e) -> System.out.printIn("hello Lambda")
 * e  -> System.out.printIn(e)  //若只有一个参数可以省略括号不写
 * <p>
 * 语法格式三：有两个以上的参数，有返回值，并且Lambda 体中有有多条语句
 * Comparator<Integer> com = (x, y) -> {
 * Systen.out.println("函数接口");
 * return Integer.compare(x,y);
 * }
 * <p>
 * 语法格式四：若大括号内只有一条语句 大括号可以省略  return 也可以省略
 * Comparator<Integer> com = Integer::compare
 * Comparator<Integer> com = (x, y) ->Integer.compare(x, y);
 * <p>
 * 语法格式五：Lambda 表达式的参数列表可以不用写数据类型，因为JVM编译器会根据上下文推断出数据类型 即【类型推断】
 * <p>
 * 左右遇一括号省
 * 左侧推断类型省
 * <p>
 * <p>
 * 二：Lambda 表达式需要"函数式接口"的支持
 * 函数式接口：接口中只有一个抽象方法的接口，称为函数式接口。 可以使用@FuntionalInterface修饰
 * 可以检查是否是函数式接口
 *
 * @Author Rem
 * @Date 2020-02-10
 */

public class TestLambda2 {

    //语法格式一：抽象方法无参数 无返回值
    @Test
    public void test1() {
        int num = 5; //jdk7以前必须是final   //jdk8不用写 实际上还是final (不能运算)
        //匿名内部类
        Runnable run1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world" + num);
            }
        };
        run1.run();

        //函数式接口
        Runnable run2 = () -> System.err.println("hello Lambda" + num);
        run2.run();
    }

    @Test
    public void test2() {
        Consumer consumer = new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.println("my name is ---" + o);
            }
        };
        consumer.accept("wang");

        Consumer con = (t) -> System.out.println("日期 :" + t);
        con.accept(new Date());
    }

    @Test
    public void test3() {
        Comparator<Integer> com = (x, y) -> {
            System.err.println("函数式接口");
            return Integer.compare(x, y);
        };
    }

    @Test
    public void test4() {
        // Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
        Comparator<Integer> com = Integer::compare;

    }

    //需求：对一个数进行运算
    @Test
    public void test5() {
        Integer val = operation(100, num -> num * 5);
        System.out.println(val);
    }

    public Integer operation(Integer num, MyCalculator mc) {
        return mc.getValue(num);
    }

}
